﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Asol.Reporting.Support
{
    /// <summary>
    /// Třída která usnadňuje přístup k systémovým dialogům - tak, aby byly použitelné z jednoho příkazového řádku.
    /// </summary>
    public static class SystemFileDialog
    {
        /// <summary>
        /// Dovolí uživateli najít existující soubor. Vrací true = uživatel si vybral.
        /// </summary>
        /// <param name="file">In/Out soubor (na vstupu může být null). Pokud je na vstupu zadán, pak se nabídka otevře u něj.</param>
        /// <param name="path">In/Out výchozí cesta (na vstupu může být null). Pokud je na vstupu soubor == null, pak se nabídka otevře na této cestě.</param>
        /// <param name="filter">Filtry pro výběr ve standardní Win formě</param>
        /// <param name="extension">Default přípona</param>
        /// <param name="title">Titulek okna</param>
        /// <returns></returns>
        public static bool GetExistingFile(ref string file, ref string path, string filter, string extension, string title)
        {
            string[] files;
            return GetFile(ref file, ref path, out files, filter, extension, false, false, title);
        }
        /// <summary>
        /// Dovolí uživateli vybrat soubor pro uložení. Může být existující nebo neexistující. Vrací true = uživatel si vybral.
        /// </summary>
        /// <param name="file">In/Out soubor (na vstupu může být null). Pokud je na vstupu zadán, pak se nabídka otevře u něj.</param>
        /// <param name="path">In/Out výchozí cesta (na vstupu může být null). Pokud je na vstupu soubor == null, pak se nabídka otevře na této cestě.</param>
        /// <param name="filter">Filtry pro výběr ve standardní Win formě</param>
        /// <param name="extension">Default přípona</param>
        /// <param name="title">Titulek okna</param>
        /// <returns></returns>
        public static bool GetOutputFile(ref string file, ref string path, string filter, string extension, string title)
        {
            string[] files;
            return GetFile(ref file, ref path, out files, filter, extension, true, false, title);
        }
        /// <summary>
        /// Vyhledá soubor
        /// </summary>
        /// <param name="file"></param>
        /// <param name="path"></param>
        /// <param name="files"></param>
        /// <param name="filter"></param>
        /// <param name="extension"></param>
        /// <param name="selectForSave"></param>
        /// <param name="multiSelect"></param>
        /// <param name="title"></param>
        /// <returns></returns>
        public static bool GetFile(ref string file, ref string path, out string[] files, string filter, string extension, bool selectForSave, bool multiSelect, string title)
        {
            if (!String.IsNullOrEmpty(file))
            {
                path = System.IO.Path.GetDirectoryName(file);
                file = System.IO.Path.GetFileName(file);
            }
            else if (String.IsNullOrEmpty(path))
                path = "";
            files = null;
            if (!selectForSave)
            {
                using (System.Windows.Forms.OpenFileDialog ofd = new System.Windows.Forms.OpenFileDialog())
                {	// Open:
                    ofd.AddExtension = true;
                    ofd.AutoUpgradeEnabled = true;
                    ofd.DefaultExt = extension;
                    ofd.FileName = file;
                    ofd.Filter = filter;
                    ofd.FilterIndex = 1;
                    ofd.CheckFileExists = true;
                    ofd.CheckPathExists = true;
                    ofd.InitialDirectory = path;
                    ofd.Multiselect = multiSelect;
                    ofd.RestoreDirectory = true;
                    ofd.SupportMultiDottedExtensions = true;
                    ofd.Title = title;
                    ofd.ValidateNames = false;

                    var result = ofd.ShowDialog();
                    if (result == System.Windows.Forms.DialogResult.OK)
                    {
                        file = ofd.FileName;
                        path = System.IO.Path.GetDirectoryName(file);
                        files = ofd.FileNames;
                        return true;
                    }
                }
            }
            else
            {
                using (System.Windows.Forms.SaveFileDialog sfd = new System.Windows.Forms.SaveFileDialog())
                {	// Save:
                    sfd.AddExtension = true;
                    sfd.AutoUpgradeEnabled = true;
                    sfd.CreatePrompt = false;
                    sfd.DefaultExt = extension;
                    sfd.FileName = file;
                    sfd.Filter = filter;
                    sfd.FilterIndex = 1;
                    sfd.CheckFileExists = false;
                    sfd.CheckPathExists = true;
                    sfd.InitialDirectory = path;
                    sfd.OverwritePrompt = true;
                    sfd.RestoreDirectory = true;
                    sfd.SupportMultiDottedExtensions = true;
                    sfd.Title = title;
                    sfd.ValidateNames = false;

                    var result = sfd.ShowDialog();
                    if (result == System.Windows.Forms.DialogResult.OK)
                    {
                        file = sfd.FileName;
						if (!String.IsNullOrEmpty(extension) && System.IO.Path.GetExtension(file).ToLower() != extension.ToLower())
							file += extension;
                        path = System.IO.Path.GetDirectoryName(file);
                        return true;
                    }
                }
            }
            return false;
        }
    }
    /// <summary>
    /// Třída která usnadňuje přístup k souborovým operacím - tak, aby byly použitelné z jednoho příkazového řádku.
    /// </summary>
	public static class SystemIoSupport
	{
		/// <summary>
		/// Zajistí vytvoření adresáře pro daný soubor (pokud adresář dosud neexistuje).
		/// Pokud adresář není možno vytvořit, vrací false.
		/// </summary>
		/// <param name="fileName"></param>
		/// <returns></returns>
		public static bool CreatePathForFile(string fileName)
		{
			return CreatePathForFile(fileName, null);
		}
		/// <summary>
		/// Zajistí vytvoření adresáře pro daný soubor (pokud adresář dosud neexistuje).
		/// Pokud adresář není možno vytvořit, vrací false.
		/// Je možno zadat hlášku pro případ chyby. Pokud nebude zadána, nezobrazí se.
		/// </summary>
		/// <param name="fileName"></param>
		/// <param name="errMsg">Text chybové hlášky pro případ, kdy nebude možno adresíř vytvořit.</param>
		/// <returns></returns>
		public static bool CreatePathForFile(string fileName, string errMsg)
		{
			string eol = Environment.NewLine;

			System.IO.FileInfo fileInfo = new System.IO.FileInfo(fileName);
			System.IO.DirectoryInfo dirInfo = fileInfo.Directory;
			dirInfo.Refresh();
			if (!dirInfo.Exists)
			{
				try
				{
					dirInfo.Create();
				}
				catch (Exception exc)
				{
					if (!String.IsNullOrEmpty(errMsg))
						Assistant.ShowWarning(errMsg + eol + dirInfo.FullName + eol + eol + exc.Message);
					return false;
				}
				dirInfo.Refresh();
			}
			if (!dirInfo.Exists && !String.IsNullOrEmpty(errMsg))
                Assistant.ShowWarning(errMsg + Environment.NewLine + dirInfo.FullName);
			return dirInfo.Exists;
		}
	}
}



